; 寄存器 Intel register:
; rax rbx rcx rdx
; rsi rdi rbp rsp
; r8 r9 r10 r11
; r12 r13 r14 r15

; Caller-saved / Callee-saved 测略：
; 为了在调用函数前后，寄存器内容相同
; 不同register的测略不同


	.file	"mstore.c"
	.text
	.globl	mulstore
	.type	mulstore, @function

; "."开头的行 都是指导汇编器 连接器 工作的伪指令， 
; 其余的行是和C代码相关的

mulstore:
.LFB0:
	.cfi_startproc
	endbr64
	pushq	%rbx
	; 将寄存器rbx中的值 压入stack进行保存
	; rbx是被调用者保存，所以在调用这个函数mulstore()之前，
	; 先保存寄存器的内容
	.cfi_def_cfa_offset 16
	.cfi_offset 3, -16
	movq	%rdx, %rbx
	; 然后把rdx寄存器的内容复制到rbx
	; 参数分别保存在：
; void mulstore(long x, long y, long* dest){
                ;  rdi      rsi       rdx

	; 然后rdx与rdx都指向dest指针存储的这个地址	
	; movq后面的q的意思是quadra，4 words

	call	mult2@PLT
	movq	%rax, (%rbx)
	popq	%rbx
	; 在函数返回之前， 恢复现场
	.cfi_def_cfa_offset 8
	ret
	.cfi_endproc
.LFE0:
	.size	mulstore, .-mulstore
	.ident	"GCC: (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0"
	.section	.note.GNU-stack,"",@progbits
	.section	.note.gnu.property,"a"
	.align 8
	.long	1f - 0f
	.long	4f - 1f
	.long	5
0:
	.string	"GNU"
1:
	.align 8
	.long	0xc0000002
	.long	3f - 2f
2:
	.long	0x3
3:
	.align 8
4:

; size of data type in x86_64:
; char byte b 1bytes
; short word w 2bytes
; int double word l 4bytes
; long, char* quad word q 8
; float single precision s 4bytes
; double double precision l 8bytes